  'use strict';
  const { Model } = require('sequelize');
  const bcrypt = require('bcryptjs');

  module.exports = (sequelize, DataTypes) => {
    class User extends Model {}

    User.init({
      avatar: {
        type: DataTypes.STRING(255),
        allowNull: true,
        validate:{
          isUrl:{msg:'图片地址不正确'}
        }
      },
      sex: {
        type: DataTypes.ENUM('male', 'female', 'other'),
        allowNull: false,
        validate:{
          notNull:{msg:'性别必须填写。'},
          notEmpty:{msg:'性别不能为空。'},
          isIn:{args:[[0,1,2]],msg:'性别的值必须是,男性：0 女性：1，未选择：2。'}
        }
      },
      introduce: {
        type: DataTypes.TEXT,
        allowNull: true,
      },
      username: {
        type: DataTypes.STRING(100),
        allowNull: false,
        validate:{
          notNull:{msg:'用户名必须填写。'},
          notEmpty:{msg:'用户名不能为空。'},
          len:{args:[2,45],msg:"用户名长度必须是2~45之间。"},
          async isUnique(value){
            const username = await User.findOne({where:{username:value}})
            if (username){
              throw new Error("用户名已存在。");
              
            }
          }
        }
      },
      phone: {
        type: DataTypes.STRING(20),
        allowNull: false,
        // unique: true,
        validate:{
          notNull:{msg:'手机号码必须填写。'},
          notEmpty:{msg:'手机号码不能为空。'},
          is:{
            args:[/^1(3[0-9]|4[5-9]|5[0-9]|6[0-5]|7[0-8]|8[0-9]|9[0-9])\d{8}$/],
            msg:"手机号码必须是真实的"
          },
          async isUnique(value){
            const phone = await User.findOne({where:{phone:value}})
            if (phone){
              throw new Error("手机号码已存在。");
              
            }
          }
        }
      },
      password: {
        type: DataTypes.CHAR(64),
        allowNull: false,
        // unique:true,
        validate:{
          notNull:{msg:'密码必须填写。'},
          notEmpty:{msg:'密码不能为空。'},
          is:{
            args:[/^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$/],
            msg:"最少6位，包括至少1个大写字母，1个小写字母，1个数字，1个特殊字符。"
          },
          set(value){
            this.setDataValue('password',bcrypt.hashSync(value,10))
          }
        }
      },
      role:{
        type:DataTypes.TINYINT,
        allowNull:false,
        validate:{
          notNull:{msg:"用户组必须填写"},
          notEmpty:{msg:"用户组不能为空。"},
          isIn:{args:[[0,100]],msg:'用户组的值必须是，普通用户：0 管理员：100。'}
        }
      },
      createdAt: {
        field: 'created_at',
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
      },
      updatedAt: {
        field: 'updated_at',
        type: DataTypes.DATE,
        defaultValue: DataTypes.NOW,
        onUpdate: DataTypes.NOW,
      },
    }, {
      sequelize,
      modelName: 'User',
      tableName: 'users',
      timestamps: true,
    });

    return User;
  };